// 认证服务
import bcrypt from 'bcrypt';
import jwt from 'jsonwebtoken';
import { getPrisma } from '../config/prisma.js';

/**
 * 用户注册服务
 * 处理用户注册业务逻辑
 * @param {string} username - 用户名
 * @param {string} email - 邮箱
 * @param {string} password - 密码
 * @returns {Promise<Object>} 注册结果
 */
async function registerUser(username, email, password) {
  try {
    const prismaClient = await getPrisma();
    console.log('正在数据库中注册用户:', username);
    
    // 1. 验证输入
    if (!username || !email || !password) {
      throw new Error('用户名、邮箱和密码是必需的');
    }
    
    // 2. 检查用户是否已存在
    const existingUser = await prismaClient.user.findFirst({
      where: {
        OR: [
          { username: username },
          { email: email }
        ]
      }
    });
    
    if (existingUser) {
      throw new Error('用户已存在');
    }
    
    // 3. 哈希密码
    const hashedPassword = await bcrypt.hash(password, 10);
    
    // 4. 在数据库中创建用户
    const user = await prismaClient.user.create({
      data: {
        username,
        email,
        passwordHash: hashedPassword
      }
    });
    
    console.log('用户创建成功，ID:', Number(user.id));
    
    // 5. 创建默认任务分组
    await prismaClient.taskGroup.create({
      data: {
        userId: user.id,
        name: '任务',
        isDefault: true
      }
    });
    
    // 6. 返回用户数据（不包含密码）
    return {
      user_id: Number(user.id),
      username: user.username,
      email: user.email,
      created_at: user.createdAt.toISOString()
    };
  } catch (error) {
    console.error('认证服务中的数据库操作失败:', error.message);
    throw error;
  }
}

/**
 * 用户登录服务
 * 处理用户登录业务逻辑
 * @param {string} username - 用户名或邮箱
 * @param {string} password - 密码
 * @returns {Promise<Object>} 登录结果，包含认证令牌
 */
async function loginUser(username, password) {
  try {
    const prismaClient = await getPrisma();
    console.log('正在登录用户:', username);
    
    // 1. 通过用户名/邮箱查找用户
    const user = await prismaClient.user.findFirst({
      where: {
        OR: [
          { username: username },
          { email: username }
        ]
      }
    });
    
    if (!user) {
      throw new Error('无效的用户名或密码');
    }
    
    // 2. 比较密码
    const isValidPassword = await bcrypt.compare(password, user.passwordHash);
    
    if (!isValidPassword) {
      throw new Error('无效的用户名或密码');
    }
    
    // 3. 生成JWT令牌
    const token = jwt.sign({ userId: Number(user.id), username: user.username }, process.env.JWT_SECRET || 'secret', { expiresIn: '24h' });
    
    console.log('用户登录成功');
    
    // 4. 返回令牌和用户数据
    return {
      user_id: Number(user.id),
      username: user.username,
      token,
      expires_at: new Date(Date.now() + 24 * 60 * 60 * 1000).toISOString()
    };
  } catch (error) {
    console.error('认证服务中的数据库操作失败:', error.message);
    throw error;
  }
}

export default {
  registerUser,
  loginUser
};
